package com.um.weixin.mini.service.impl;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
import com.um.weixin.mini.service.WxMiniUserService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Title
 * @Description
 * @Author renjunwei
 * @Date 2023/5/31 17:33
 */
@Service
@Slf4j
public class WxMiniUserServiceImpl implements WxMiniUserService {

    @Autowired
    WxMaService wxMaService;

    /**
     * 获取登录后的session信息.
     *
     * @param appId  小程序id
     * @param jsCode 登录时获取的 code
     * @return .
     * @throws WxErrorException .
     */
    @Override
    public WxMaJscode2SessionResult getSessionInfo(String appId, String jsCode) throws WxErrorException {
        if (!wxMaService.switchover(appId)) {
            throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置，请核实！", appId));
        }

        return getSessionInfo(jsCode);
    }

    /**
     * 获取登录后的session信息.
     *
     * @param jsCode 登录时获取的 code
     * @return .
     * @throws WxErrorException .
     */
    @Override
    public WxMaJscode2SessionResult getSessionInfo(String jsCode) throws WxErrorException {
        WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(jsCode);
        return session;
    }

    /**
     * 解密用户敏感数据.
     *
     * @param sessionKey    会话密钥
     * @param encryptedData 消息密文
     * @param ivStr         加密算法的初始向量
     */
    @Override
    public WxMaUserInfo getUserInfo(String sessionKey, String encryptedData, String ivStr) {
        WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, encryptedData, ivStr);
        return userInfo;
    }

    /**
     * 解密用户手机号信息.
     *
     * @param sessionKey    会话密钥
     * @param encryptedData 消息密文
     * @param ivStr         加密算法的初始向量
     * @return .
     * @deprecated 请使用替代方法 {@link #getPhoneNoInfo(String)}
     */
    @Override
    public WxMaPhoneNumberInfo getPhoneNoInfo(String sessionKey, String encryptedData, String ivStr) {
        WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, ivStr);
        return phoneNoInfo;
    }

    /**
     * 获取手机号信息,基础库:2.21.2及以上
     *
     * @param code 动态令牌
     * @return .
     * @throws WxErrorException .
     */
    @Override
    public WxMaPhoneNumberInfo getPhoneNoInfo(String code) throws WxErrorException {
        WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getPhoneNoInfo(code);
        return phoneNoInfo;
    }
}
